#include <functional>
#include <iostream>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

using server_t = websocketpp::server<websocketpp::config::asio>;

void openHandler(websocketpp::connection_hdl hdl) {
    std::cout << "连接建立" << std::endl;
}

void closeHandler(websocketpp::connection_hdl hdl) {
    std::cout << "连接断开" << std::endl;
}

void messageHandler(server_t* server, websocketpp::connection_hdl hdl,
                    server_t::message_ptr msg) {
    // 1. 获取有效消息在和数据
    std::string body = msg->get_payload();
    std::cout << "收到消息: " << body << std::endl;

    // 2. 对客户端进行响应
    // 获取通信连接
    auto conn = server->get_con_from_hdl(hdl);
    // 发送数据
    conn->send(body + "-hello", websocketpp::frame::opcode::value::text);
}

int main() {
    // 1. 实例化服务器对象
    server_t server;

    // 2. 初始化日志输出 - 关闭日志输出
    server.set_access_channels(websocketpp::log::alevel::none);

    // 3. 初始化 asio 框架
    server.init_asio();

    // 4. 设置消息处理/连接握手成功/连接关闭回调函数
    server.set_open_handler(openHandler);
    server.set_close_handler(closeHandler);
    auto message_handler = std::bind(
        &messageHandler, &server, std::placeholders::_1, std::placeholders::_2);
    server.set_message_handler(message_handler);

    // 5. 启用地址复用
    server.set_reuse_addr(true);

    // 6. 设置监听端口
    server.listen(8080);

    // 7. 开始监听
    server.start_accept();

    // 8. 启动服务器
    server.run();

    return 0;
}